package com.lsp.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.List;

/**
 * 代理核心类，生成代理对象，Enhancer.create()
 */
public class ProxyFactory {
    /**
     * 输入一个目标类和一组proxy接口实现，输出一个代理对象
     * @param targetClass  目标类
     * @param proxyList    代理类
     * @param <T>          对应类型
     * @return             输出目标类加代理类的集合，也就是代理对象
     */
    @SuppressWarnings("unchecked")
    public static <T> T createProxy(final Class<?> targetClass,final List<Proxy> proxyList){
        return (T) Enhancer.create(targetClass, new MethodInterceptor() {
            /**
             * 代理方法，每次调用都会创建一个ProxyChain对象，然后调用该对象的 doProxyChain()方法;
             * @param targetObject
             * @param targetMethod
             * @param methodParams
             * @param methodProxy
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object targetObject, Method targetMethod, Object[] methodParams, MethodProxy methodProxy) throws Throwable {
                return new ProxyChain(targetClass, targetObject, targetMethod, methodProxy, methodParams, proxyList).deProxyChain();
            }
        });
    }
}
